package ace.module.product.core.impl.service.helper;

import ace.cmp.data.spring.data.jdbc.querydsl.rsql.core.model.SaveContext;
import ace.cmp.data.spring.data.jdbc.querydsl.rsql.core.model.SaveListContext;
import ace.cmp.util.AceStreamUtils;
import ace.module.product.api.model.input.PmsProductAttributeSaveInput;
import ace.module.product.core.impl.dao.entity.PmsProduct;
import ace.module.product.core.impl.dao.entity.PmsProductAttribute;
import ace.module.product.core.impl.dao.entity.PmsProductAttributeValue;
import ace.module.product.core.impl.dao.model.bo.PmsProductAttributeAndValueSaveBo;
import ace.module.product.core.impl.dao.model.bo.PmsProductAttributeSaveBo;
import ace.module.product.core.impl.manager.PmsProductAttributeManager;
import ace.module.product.core.impl.manager.PmsProductAttributeValueManager;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

/**
 * .
 * @author Caspar
 *
 */
@AllArgsConstructor
@Component
public class PmsProductAttributeHelper {

  private final PmsProductAttributeManager pmsProductAttributeManager;
  private final PmsProductAttributeValueManager pmsProductAttributeValueManager;

  public PmsProductAttributeSaveBo assemblePmsProductAttributeSaveBo(
      List<PmsProductAttributeSaveInput> pmsProductAttributeSaveInputs,
      SaveContext<PmsProduct> pmsProductSaveContext
  ) {
    List<PmsProductAttributeAndValueSaveBo> pmsProductAttributeAndValueSaveBos = pmsProductAttributeSaveInputs
        .stream()
        .map(productSpecAttributeInput -> {
          SaveContext<PmsProductAttribute> pmsProductAttributeSaveContext = pmsProductAttributeManager.assemblePmsProductAttributeSaveContext(
              pmsProductSaveContext,
              productSpecAttributeInput
          );

          SaveListContext<PmsProductAttributeValue> pmsProductAttributeValues = pmsProductAttributeValueManager.assemblePmsProductSpecAttributeValueSaveListContext(
              pmsProductAttributeSaveContext,
              productSpecAttributeInput.getProductAttributeValues()
          );
          return PmsProductAttributeAndValueSaveBo.builder()
              .attribute(pmsProductAttributeSaveContext)
              .attributeValues(pmsProductAttributeValues)
              .build();
        })
        .collect(Collectors.toList());

    return PmsProductAttributeSaveBo.builder()
        .attributeAndValues(pmsProductAttributeAndValueSaveBos)
        .build();
  }
}
